[新機能]Snowflakeでユーザー・ウェアハウス・クエリタグごとの消費クレジットを簡単に集計できる「QUERY_ATTRIBUTION_HISTORY」ビューがリリースされました

[新機能]Snowflakeでユーザー・ウェアハウス・クエリタグごとの消費クレジットを簡単に集計できる「QUERY_ATTRIBUTION_HISTORY」ビューがリリースされました

Clock Icon2024.09.04

さがらです。

つい先日のリリースで、QUERY_ATTRIBUTION_HISTORYという新しいAccount Usageのビューが使えるようになりました。

https://docs.snowflake.com/en/release-notes/2024/other/2024-08-30-per-query-cost-attribution#account-usage-new-query-attribution-history-view

すでにXやSnowflakeのコミュニティなどでも話題になっていますが、実際にわたしも挙動を確かめてみたので、簡単にですがブログにしてみます。

QUERY_ATTRIBUTION_HISTORYとは

まず、今回追加されたQUERY_ATTRIBUTION_HISTORYがどういったビューなのか簡単に説明します。

https://docs.snowflake.com/en/sql-reference/account-usage/query_attribution_history

このビューを使用すると、過去365日間 (1年間) にアカウント内のウェアハウスで実行された特定のクエリの計算コストを確認することが出来ます。

下図はドキュメントからの引用ですが、ビューの1レコードが1クエリに該当し、消費したクレジットcredits_attributed_computecredits_used_query_accelerationで確認することが出来ます。

また、クエリを実行したユーザーを確認できるuser_nameや、クエリごとに設定したタグを確認できるquery_tagという列もありますので、ユーザーごと、クエリタグごと、に消費したクレジットを確認することが可能です。

2024-09-04_05h52_42

注意点としては、ドキュメントからの引用ですが以下の点が挙げられます。

  • Account Usageのビューのため、更新まで最大6時間要すること
  • 実行時間が短いクエリ (<= ~100 ミリ秒) は、このビューには含まれないこと
  • すべての列のデータは、2024年7月1日以降のクエリで利用できること(この日付より前のデータの一部もビューで利用できるが、不完全な可能性があるとのこと)
    • 実際、数年間使用している弊社の検証環境で雑にselect * ~中略~ order by start_timeを実行したところ、2024-08-19以降に発行されたクエリしか確認できませんでした

2024-09-04_06h13_36

2024/9/5追記

@hrk_mrksさんがこちらのビューについて検証をしており、ドキュメントには記載のない注意点もあることがわかりました。(検証ありがとうございます!)

https://zenn.dev/hrk_mrks/articles/a6e0d58c4043b7

具体的には、「QUERY_ATTRIBUTION_HISTORYビューはウェアハウスのアイドル時間を考慮していないため、WAREHOUSE_METERING_HISTORYビューで確認できる消費クレジットよりもQUERY_ATTRIBUTION_HISTORYビューで確認できる消費クレジットは低くなる = QUERY_ATTRIBUTION_HISTORYビューで確認できる値は実際のコストと乖離がある」という点が注意事項となります。

試してみた

ということで、実際に試してみたいと思います。

使用するクエリは、下記のドキュメントを参考に少し条件を変更したものを使っています。

https://docs.snowflake.com/en/user-guide/cost-attributing#label-attribute-query-cost

https://docs.snowflake.com/en/sql-reference/account-usage/query_attribution_history

下記のクエリを実行すると、アカウント内のユーザーが今年どれだけのクレジットを使用したかを確認できます。

SELECT user_name, SUM(credits_attributed_compute) AS credits
  FROM SNOWFLAKE.ACCOUNT_USAGE.QUERY_ATTRIBUTION_HISTORY
  WHERE start_time >= DATE_TRUNC('YEAR', CURRENT_DATE)
    AND start_time < CURRENT_DATE
  GROUP BY user_name;

2024-09-04_06h21_41

下記のクエリを実行すると、アカウント内の各ウェアハウスごとに今年どれだけのクレジットを使用したかを確認できます。

SELECT warehouse_name, SUM(credits_attributed_compute) AS credits
  FROM SNOWFLAKE.ACCOUNT_USAGE.QUERY_ATTRIBUTION_HISTORY
  WHERE start_time >= DATE_TRUNC('YEAR', CURRENT_DATE)
    AND start_time < CURRENT_DATE
  GROUP BY warehouse_name;

2024-09-04_06h28_33

下記のクエリを実行すると、各クエリタグごとに今年どれだけのクレジットを使用したかを確認できます。

検証環境のためちゃんとしたクエリタグの運用をしていないのですが、最近私が検証したOmniで実行されたクエリや、Fivetranのdbt Transformationで実行されたクエリなどがクエリタグから確認できます。

WITH wh_bill AS (
   SELECT SUM(credits_used_compute) AS compute_credits
     FROM SNOWFLAKE.ACCOUNT_USAGE.WAREHOUSE_METERING_HISTORY
     WHERE start_time >= DATE_TRUNC('YEAR', CURRENT_DATE)
     AND start_time < CURRENT_DATE
),
tag_credits AS (
   SELECT COALESCE(NULLIF(query_tag, ''), 'untagged') AS tag,
          SUM(credits_attributed_compute) AS credits
     FROM SNOWFLAKE.ACCOUNT_USAGE.QUERY_ATTRIBUTION_HISTORY
     WHERE start_time >= DATE_TRUNC('YEAR', CURRENT_DATE)
     AND start_time < CURRENT_DATE
     GROUP BY tag
),
total_credit AS (
   SELECT SUM(credits) AS sum_all_credits
     FROM tag_credits
)
SELECT tc.tag,
       tc.credits / t.sum_all_credits * w.compute_credits AS attributed_credits
  FROM tag_credits tc, total_credit t, wh_bill w;

2024-09-04_06h24_39

参考までに、クエリタグ自体の設定は下記のSELECT社の記事が参考になると思います。ユーザーごとにデフォルトのクエリタグを設定したり、dbtでクエリタグを設定する方法が記載されています。

https://select.dev/posts/snowflake-query-tags

最後に

新しくリリースされたQUERY_ATTRIBUTION_HISTORYビューを試してみました。

注意点で述べた仕様から過去1年間すべてのクエリのデータがこのビューに存在しないことに注意する必要がありますが、このビュー1つで簡単にユーザーごとやクエリタグごとの集計が出来ますので、部署やプロジェクトごとの消費クレジットを管理したい場合にはとても便利なビューだと思います!

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.